home *** CD-ROM | disk | FTP | other *** search
/ Day Cry / Day Cry CD.bin / oh_towns / taropyon / splib / splib.lzh / PRG / LHX / MAKETBL.C < prev    next >
C/C++ Source or Header  |  1992-12-08  |  2KB  |  101 lines

  1. /***********************************************************
  2.         maketbl.c -- makes decoding table
  3. ***********************************************************/
  4. #include    "lh386.h"
  5.  
  6. #include    "slidehuf.h"
  7. #include    "intrface.h"
  8.  
  9. #ifdef    __HIGHC__
  10. #    pragma    On(Align_labels);
  11. #endif
  12.  
  13.  
  14. void        make_table(short nchar, uchar bitlen[], short tablebits, ushort table[])
  15. {
  16.     ushort        count[17];        /* âRü[âhÆ╖é▓é╞é╠Åoî╗î┬Éö */
  17.     ushort        weight[17];     /* 0x10000ul >> bitlen */
  18.     ushort        start[17];        /* é╗é╠ bitlen é╠ì┼Åëé╠âRü[âhüiì╢ïlé▀üj */
  19.     ushort        total;
  20.     uint        i;
  21.     int         j, k, l, m, n, avail;
  22.     ushort       *p;
  23.  
  24.     avail = nchar;
  25.  
  26.     /* Åëè·ë╗ */
  27.     for (i = 1; i <= 16; i++)
  28.     {
  29.         count[i] = 0;
  30.         weight[i] = 1u << (16 - i);
  31.     }
  32.  
  33.     /* Åoî╗ë±Éöé≡ÉöéªéΘ */
  34.     for (i = 0; i < nchar; i++)
  35.         count[bitlen[i]]++;
  36.  
  37.     /* ì┼Åëé╠âRü[âhé╠îvÄZ */
  38.     total = 0;
  39.     for (i = 1; i <= 16; i++)
  40.     {
  41.         start[i] = total;
  42.         total += weight[i] * count[i];
  43.     }
  44.     if ((total & 0xFFFF) != 0)
  45.         error(BROKENARC, "Bad table (5)");
  46.  
  47.     /* table ì∞ɼé╠é╜é▀üAtable é╔ôⁿéΘòöò¬é≡ëEïlé▀é╔ò╧ìX */
  48.     m = 16 - tablebits;
  49.     for (i = 1; i <= tablebits; i++)
  50.     {
  51.         start[i] >>= m;
  52.         weight[i] >>= m;
  53.     }
  54.  
  55.     /* table é≡ê∞éΩéΘâRü[âhé╠é╜é▀é╠Åëè·ë╗ */
  56.     j = start[tablebits + 1] >> m;
  57.     k = 1 << tablebits;
  58.     if (j != 0)
  59.         for (i = j; i < k; i++)
  60.             table[i] = 0;
  61.  
  62.     /* table, tree é╠ì∞ɼ */
  63.     for (j = 0; j < nchar; j++)
  64.     {
  65.         k = bitlen[j];
  66.         if (k == 0)
  67.             continue;
  68.         l = start[k] + weight[k];
  69.         if (k <= tablebits)
  70.         {
  71.             /* table é╔ö[é▄éΘâRü[âh */
  72.             for (i = start[k]; i < l; i++)
  73.                 table[i] = j;
  74.         } else
  75.         {
  76.             /* table é╔ö[é▄éτé╚éóâRü[âh */
  77.             p = &table[(i = start[k]) >> m];
  78.             i <<= tablebits;
  79.             n = k - tablebits;
  80.             /* ìéé│ n é╠ tree é≡ì∞éΘ */
  81.             while (--n >= 0)
  82.             {
  83.                 if (*p == 0)
  84.                 {
  85.                     /* Ä}é¬é▄é╛ëäé╤é─éóé╚é»éΩé╬ì∞éΘ */
  86.                     right[avail] = left[avail] = 0;
  87.                     *p = avail++;
  88.                 }
  89.                 if (i & 0x8000)
  90.                     p = &right[*p];
  91.                 else
  92.                     p = &left[*p];
  93.                 i <<= 1;
  94.             }
  95.             *p = j;
  96.         }
  97.         /* bitlen é¬ k é╠ăé╠ò╢ÄÜé╠âRü[âh */
  98.         start[k] = l;
  99.     }
  100. }
  101.